# Copyright (C) 2009 Samuel Abels, http://debain.org
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2, as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
from Blob import Blob
from Text import Text
from Xml  import Xml

#FIXME: copied from util, this sucks.
mime_map = {'unknown':    Blob,
            'text/plain': Text,
            'text/xml':   Xml}
def create_blob(mime_type, data):
    blob_type = mime_map[mime_type]
    if blob_type is None:
        raise Exception('Unknown mime type %s.' % mime_type)
    return blob_type.from_db(data)

class MultiBlob(Blob):
    def __init__(self, **kwargs):
        Blob.__init__(self, None, 'multiblob')
        self.blobs = kwargs


    @classmethod
    def from_db(self, data):
        blob = MultiBlob()
        data = str(data)
        if data == '':
            return blob
        index_end = data.index("\n\n")
        index     = data[:index_end]
        data      = data[index_end + 2:]
        for line in index.split("\n"):
            start, end, mime_type, name = line.split('|')
            blob.blobs[name] = create_blob(mime_type,
                                           data[int(start):int(end)])
        return blob


    def __str__(self):
        if self.text is not None:
            return self.text
        return '\n'.join([str(b) for b in self.blobs.itervalues()])


    def bin(self):
        index = ''
        data  = ''
        pos   = 0
        for name, blob in self.blobs.iteritems():
            cdata  = blob.bin()
            end    = pos + len(cdata)
            tuple  = [str(pos), str(end), blob.mime_type, name]
            index += '|'.join(tuple) + "\n"
            data  += cdata
            pos    = end
        return index + "\n" + data


    def set(self, blob_name, blob):
        self.blobs[blob_name] = blob


    def add(self, blob_name, blob):
        self.set(blob_name, blob)


    def get(self, blob_name):
        return self.blobs[blob_name]
